AFLAGS	= 
LFLAGS	= -C javabin.cfg -m vm02.map
BINFILE	= vm02.bin
OBJS	= vm02.o memmgr.o codemgr.o strpool.o classclass.o sysclass.o string.o classload.o utils.o frame.o thread.o io.o ops.o except.o
LOADER	= java.system.sys
A2CLASSES	= apple2/vm02.class apple2/conio.class apple2/AppleStuff.class apple2/OutputConsole.class apple2/PrintConsole.class apple2/InputConsole.class apple2/ProDOS.class apple2/SystemException.class \
	  apple2/OutputSSC.class apple2/InputSSC.class apple2/Mouse.class
LANGCLASSES     = java/lang/Thread.class java/lang/System.class java/lang/Throwable.class java/lang/Error.class java/lang/ThreadDeath.class java/lang/VirtualMachineError.class java/lang/Exception.class \
                  java/lang/RuntimeException.class java/lang/InternalError.class java/lang/OutOfMemoryError.class java/lang/StackOverflowError.class java/lang/LinkeageError.class java/lang/NoClassDefFoundError.class \
                  java/lang/ClassFormatError.class java/lang/IncompatibleClassChangeError.class java/lang/NoSuchFieldError.class java/lang/NoSuchMethodError.class java/lang/ClassCastException.class \
                  java/lang/IllegalArgumentException.class java/lang/IllegalMonitorStateException.class java/lang/IllegalThreadStateException.class java/lang/ClassNotFoundException.class \
                  java/lang/InterruptedException.class java/lang/NullPointerException.class java/lang/IndexOutOfBoundsException.class java/lang/ArrayIndexOutOfBoundsException.class java/lang/StringIndexOutOfBoundsException.class \
                  java/lang/NegativeArraySizeException.class java/lang/ArrayStoreException.class java/lang/ArithmeticException.class \
                  java/lang/Boolean.class java/lang/Character.class java/lang/Number.class java/lang/Integer.class java/lang/Float.class java/lang/StringBuilder.class
IOCLASSES       = java/io/OutputStream.class java/io/FilterOutputStream.class java/io/PrintStream.class java/io/InputStream.class
CLASSES	= $(A2CLASSES) $(LANGCLASSES) $(IOCLASSES)
SAMPLES	= Hello.class HelloWorld.class P8.class SimplePong.class Moire.class RodsColors.class HiResDemo.class List.class Terminal.class
VERSION	= beta1
RELEASEDIR	= release-$(VERSION)
SAMPLESDIR	= samples-$(VERSION)

all: $(BINFILE) $(LOADER) $(CLASSES)

vm02: $(BINFILE) $(LOADER)

samples: $(SAMPLES)

classes: $(CLASSES)

clean:
	rm -f $(BINFILE) $(OBJS) $(LOADER) loader.o $(CLASSES) apple2/vm02.o $(SAMPLES)
	
release:
	rm -rf $(RELEASEDIR)
	rm -rf $(SAMPLESDIR)
	mkdir $(RELEASEDIR)
	mkdir $(RELEASEDIR)/APPLE2
	mkdir $(RELEASEDIR)/JAVA
	mkdir $(RELEASEDIR)/JAVA/LANG
	mkdir $(RELEASEDIR)/JAVA/IO
	mkdir $(SAMPLESDIR)
	cp PRODOS.SYS $(RELEASEDIR)/PRODOS.SYS
	cp java.system.sys $(RELEASEDIR)/JAVA.SYSTEM.SYS
	cp vm02.bin $(RELEASEDIR)/VM02.BIN
	cp LIST.BIN $(RELEASEDIR)/STARTUP.BIN
	cp readme.txt $(RELEASEDIR)/README.TXT.TXT
	cp apple2/*.BIN $(RELEASEDIR)/APPLE2
	cp java/lang/*.BIN $(RELEASEDIR)/JAVA/LANG
	cp java/io/*.BIN $(RELEASEDIR)/JAVA/IO
	cp *.BIN $(SAMPLESDIR)
	
$(LOADER): loader.s
	ca65 $(AFLAGS) $<
	ld65 -C loader.cfg loader.o -o $(LOADER)
    
$(BINFILE): $(OBJS)
	ld65 $(LFLAGS) $(OBJS) -o $(BINFILE)

#
# VM02 source
#

vm02.o: vm02.s global.inc
	ca65 $(AFLAGS) $<

memmgr.o: memmgr.s global.inc
	ca65 $(AFLAGS) $<

codemgr.o: codemgr.s global.inc
	ca65 $(AFLAGS) $<

strpool.o: strpool.s global.inc
	ca65 $(AFLAGS) $<

thread.o: thread.s global.inc
	ca65 $(AFLAGS) $<

frame.o: frame.s global.inc frame.inc
	ca65 $(AFLAGS) $<

classclass.o: classclass.s global.inc
	ca65 $(AFLAGS) $<

sysclass.o: sysclass.s global.inc object.clasm array.clasm
	ca65 $(AFLAGS) $<

string.o: string.s global.inc string.clasm
	ca65 $(AFLAGS) $<

classload.o: classload.s global.inc
	ca65 $(AFLAGS) $<

ops.o: ops.s global.inc
	ca65 $(AFLAGS) $<

io.o: io.s global.inc
	ca65 $(AFLAGS) $<

except.o: except.s global.inc class.inc frame.inc
	ca65 $(AFLAGS) $<

utils.o: utils.s global.inc
	ca65 $(AFLAGS) $<

#
# Apple II classes
#

apple2/vm02.class: apple2/vm02.java apple2/vm02.clasm
	javac -g:none $<
	ca65 apple2/vm02.clasm
	ld65 -C clasm.cfg apple2/vm02.o -o apple2/VM02.BIN

apple2/conio.class: apple2/conio.java apple2/vm02.java
	javac -g:none $<
	cp apple2/conio.class apple2/CONIO.BIN

apple2/AppleStuff.class: apple2/AppleStuff.java apple2/vm02.java
	javac -g:none $<
	ca65 apple2/AppleStuff.clasm
	ld65 -C clasm.cfg apple2/AppleStuff.o -o apple2/APPLESTUFF.BIN

apple2/ProDOS.class: apple2/ProDOS.java apple2/vm02.java
	javac -g:none $<
	cp apple2/ProDOS.class apple2/PRODOS.BIN

apple2/SystemException.class: apple2/SystemException.java
	javac -g:none $<
	cp apple2/SystemException.class apple2/SYSTEMEXCEPTION.BIN

apple2/OutputConsole.class: apple2/OutputConsole.java java/io/OutputStream.java
	javac -g:none $<
	cp apple2/OutputConsole.class apple2/OUTPUTCONSOLE.BIN

apple2/PrintConsole.class: apple2/PrintConsole.java java/io/PrintStream.java
	javac -g:none $<
	cp apple2/PrintConsole.class apple2/PRINTCONSOLE.BIN

apple2/InputConsole.class: apple2/InputConsole.java java/io/InputStream.java
	javac -g:none $<
	cp apple2/InputConsole.class apple2/INPUTCONSOLE.BIN

apple2/OutputSSC.class: apple2/OutputSSC.java java/io/OutputStream.java
	javac -g:none $<
	cp apple2/OutputSSC.class apple2/OUTPUTSSC.BIN

apple2/InputSSC.class: apple2/InputSSC.java java/io/InputStream.java
	javac -g:none $<
	cp apple2/InputSSC.class apple2/INPUTSSC.BIN

apple2/Mouse.class: apple2/Mouse.java
	javac -g:none $<
	cp apple2/Mouse.class apple2/MOUSE.BIN

#
# Standard Java lang classes
#

java/lang/Thread.class: java/lang/Thread.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/Thread.class java/lang/THREAD.BIN

java/lang/System.class: java/lang/System.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/System.class java/lang/SYSTEM.BIN

java/lang/Throwable.class: java/lang/Throwable.java apple2/vm02.java
	javac -g:none $<
	cp java/lang/Throwable.class java/lang/THROWABLE.BIN

java/lang/Error.class: java/lang/Error.java
	javac -g:none $<
	cp java/lang/Error.class java/lang/ERROR.BIN

java/lang/ThreadDeath.class: java/lang/ThreadDeath.java
	javac -g:none $<
	cp java/lang/ThreadDeath.class java/lang/THREADDEATH.BIN

java/lang/VirtualMachineError.class: java/lang/VirtualMachineError.java
	javac -g:none $<
	cp java/lang/VirtualMachineError.class java/lang/VIRTUALMACHINEERROR.BIN

java/lang/InternalError.class: java/lang/InternalError.java
	javac -g:none $<
	cp java/lang/InternalError.class java/lang/INTERNALERROR.BIN

java/lang/OutOfMemoryError.class: java/lang/OutOfMemoryError.java
	javac -g:none $<
	cp java/lang/OutOfMemoryError.class java/lang/OUTOFMEMORYERROR.BIN

java/lang/StackOverflowError.class: java/lang/StackOverflowError.java
	javac -g:none $<
	cp java/lang/StackOverflowError.class java/lang/STACKOVERFLOWERROR.BIN

java/lang/LinkeageError.class: java/lang/LinkeageError.java
	javac -g:none $<
	cp java/lang/LinkeageError.class java/lang/LINKEAGEERROR.BIN

java/lang/NoClassDefFoundError.class: java/lang/NoClassDefFoundError.java
	javac -g:none $<
	cp java/lang/NoClassDefFoundError.class java/lang/NOCLASSDEFFOUNDERROR.BIN

java/lang/ClassFormatError.class: java/lang/ClassFormatError.java
	javac -g:none $<
	cp java/lang/ClassFormatError.class java/lang/CLASSFORMATERROR.BIN

java/lang/IncompatibleClassChangeError.class: java/lang/IncompatibleClassChangeError.java
	javac -g:none $<
	cp java/lang/IncompatibleClassChangeError.class java/lang/INCOMPATIBLECLASSCHANGEERROR.BIN

java/lang/NoSuchFieldError.class: java/lang/NoSuchFieldError.java
	javac -g:none $<
	cp java/lang/NoSuchFieldError.class java/lang/NOSUCHFIELDERROR.BIN

java/lang/NoSuchMethodError.class: java/lang/NoSuchMethodError.java
	javac -g:none $<
	cp java/lang/NoSuchMethodError.class java/lang/NOSUCHMETHODERROR.BIN

java/lang/Exception.class: java/lang/Exception.java
	javac -g:none $<
	cp java/lang/Exception.class java/lang/EXCEPTION.BIN

java/lang/RuntimeException.class: java/lang/RuntimeException.java
	javac -g:none $<
	cp java/lang/RuntimeException.class java/lang/RUNTIMEEXCEPTION.BIN

java/lang/IllegalArgumentException.class: java/lang/IllegalArgumentException.java
	javac -g:none $<
	cp java/lang/IllegalArgumentException.class java/lang/ILLEGALARGUMENTEXCEPTION.BIN

java/lang/IllegalMonitorStateException.class: java/lang/IllegalMonitorStateException.java
	javac -g:none $<
	cp java/lang/IllegalMonitorStateException.class java/lang/ILLEGALMONITORSTATEEXCEPTION.BIN

java/lang/IllegalThreadStateException.class: java/lang/IllegalThreadStateException.java
	javac -g:none $<
	cp java/lang/IllegalThreadStateException.class java/lang/ILLEGALTHREADSTATEEXCEPTION.BIN

java/lang/ClassCastException.class: java/lang/ClassCastException.java
	javac -g:none $<
	cp java/lang/ClassCastException.class java/lang/CLASSCASTEXCEPTION.BIN

java/lang/InterruptedException.class: java/lang/InterruptedException.java
	javac -g:none $<
	cp java/lang/InterruptedException.class java/lang/INTERRUPTEDEXCEPTION.BIN

java/lang/ClassNotFoundException.class: java/lang/ClassNotFoundException.java
	javac -g:none $<
	cp java/lang/ClassNotFoundException.class java/lang/CLASSNOTFOUNDEXCEPTION.BIN

java/lang/NullPointerException.class: java/lang/NullPointerException.java
	javac -g:none $<
	cp java/lang/NullPointerException.class java/lang/NULLPOINTEREXCEPTION.BIN

java/lang/IndexOutOfBoundsException.class: java/lang/IndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/IndexOutOfBoundsException.class java/lang/INDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/ArrayIndexOutOfBoundsException.class: java/lang/ArrayIndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/ArrayIndexOutOfBoundsException.class java/lang/ARRAYINDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/StringIndexOutOfBoundsException.class: java/lang/StringIndexOutOfBoundsException.java
	javac -g:none $<
	cp java/lang/StringIndexOutOfBoundsException.class java/lang/STRINGINDEXOUTOFBOUNDSEXCEPTION.BIN

java/lang/NegativeArraySizeException.class: java/lang/NegativeArraySizeException.java
	javac -g:none $<
	cp java/lang/NegativeArraySizeException.class java/lang/NEGATIVEARRAYSIZEEXCEPTION.BIN

java/lang/ArrayStoreException.class: java/lang/ArrayStoreException.java
	javac -g:none $<
	cp java/lang/ArrayStoreException.class java/lang/ARRAYEXCEPTION.BIN

java/lang/ArithmeticException.class: java/lang/ArithmeticException.java
	javac -g:none $<
	cp java/lang/ArithmeticException.class java/lang/ARITHMETICEXCEPTION.BIN

java/lang/Boolean.class: java/lang/Boolean.java
	javac -g:none $<
	cp java/lang/Boolean.class java/lang/BOOLEAN.BIN

java/lang/Character.class: java/lang/Character.java
	javac -g:none $<
	cp java/lang/Character.class java/lang/CHARACTER.BIN

java/lang/Number.class: java/lang/Number.java
	javac -g:none $<
	cp java/lang/Number.class java/lang/NUMBER.BIN

java/lang/Integer.class: java/lang/Integer.java
	javac -g:none $<
	cp java/lang/Integer.class java/lang/INTEGER.BIN

java/lang/Float.class: java/lang/Float.java
	javac -g:none $<
	cp java/lang/Float.class java/lang/FLOAT.BIN

java/lang/StringBuilder.class: java/lang/StringBuilder.java
	javac -g:none $<
	cp java/lang/StringBuilder.class java/lang/STRINGBUILDER.BIN

#
# Standard Java I/O classes
#

java/io/OutputStream.class: java/io/OutputStream.java
	javac -g:none $<
	cp java/io/OutputStream.class java/io/OUTPUTSTREAM.BIN

java/io/FilterOutputStream.class: java/io/FilterOutputStream.java java/io/OutputStream.java
	javac -g:none $<
	cp java/io/FilterOutputStream.class java/io/FILTEROUTPUTSTREAM.BIN

java/io/PrintStream.class: java/io/PrintStream.java java/io/FilterOutputStream.java
	javac -g:none $<
	cp java/io/PrintStream.class java/io/PRINTSTREAM.BIN

java/io/InputStream.class: java/io/InputStream.java
	javac -g:none $<
	cp java/io/InputStream.class java/io/INPUTSTREAM.BIN

#
# Sample classes
#

Hello.class: Hello.java
	javac -g:none $<
	cp Hello.class HELLO.BIN

HelloWorld.class: HelloWorld.java
	javac -g:none $<
	cp HelloWorld.class HELLOWORLD.BIN

P8.class: P8.java
	javac -g:none $<
	cp P8.class P8.BIN

List.class: List.java
	javac -g:none $<
	cp List.class LIST.BIN

SimplePong.class: SimplePong.java
	javac -g:none $<
	cp SimplePong.class SIMPLEPONG.BIN

Moire.class: Moire.java
	javac -g:none $<
	cp Moire.class MOIRE.BIN

HiResDemo.class: HiResDemo.java
	javac -g:none $<
	cp HiResDemo.class HIRESDEMO.BIN

RodsColors.class: RodsColors.java
	javac -g:none $<
	cp RodsColors.class RODSCOLORS.BIN

Terminal.class: RodsColors.java
	javac -g:none $<
	cp Terminal.class TERMINAL.BIN

